package com.ronglian.iot.utils;

import org.springframework.stereotype.Component;

import java.util.*;

/**
 * 判断对象是否为空
 *
 * @author zhangyun
 *
 */
@Component
public class CodingUtil {
	private static final Random random = new Random();

	/**
	 * 返回三位编码
	 * @param num
	 * @return
	 */
	public static String threeCode(Integer num) {
		num = num+1;
		return String.format("%03d", num);
	}

	public static String fomatString(Integer num,Integer count) {
		return String.format("%0"+count+"d", num);
	}

	/**
     * 生成指定位数的随机数，且不在指定列表中
     * 
     * @param num 随机数位数
     * @param codeList 已存在的编码列表
     * @return 生成的随机编码
     */
    public static String getCode(int num, List<String> codeList) {
        if (num <= 0) {
            throw new IllegalArgumentException("位数必须大于0");
        }
        
        // 将List转换为Set，提高查找效率
        Set<String> codeSet = new HashSet<>(codeList);
        
        // 计算最大尝试次数，避免无限循环
        int maxAttempts = (int) Math.pow(10, num) * 2; // 最多尝试2倍的数字空间
        int attempts = 0;
        
        while (attempts < maxAttempts) {
            String code = generateRandomCode(num);
            if (!codeSet.contains(code)) {
                return code;
            }
            attempts++;
        }
        
        throw new RuntimeException("无法生成唯一的" + num + "位数编码，请检查编码空间是否已满");
    }
	/**
     * 生成指定位数的随机数字编码
     * 
     * @param num 位数
     * @return 随机数字编码
     */
    private static String generateRandomCode(int num) {
        // 生成最小值和最大值
        int min =  1; // 例如：3位数最小值为100
        int max = (int) Math.pow(10, num) - 1; // 例如：3位数最大值为999
        
        // 生成随机数
        int randomNum = random.nextInt(max - min + 1) + min;
        
        // 转换为字符串，确保位数正确
        return String.format("%0" + num + "d", randomNum);
    }
    // 测试getCode方法
    public static void main(String[] args) {
        // 假设已存在的编码列表
        List<String> existingCodes = new ArrayList<>(Arrays.asList("001", "002", "003", "004", "005"));

        for (int i = 0; i < 100; i++) {
            // 生成一个3位数的随机编码
            String randomCode = getCode(3, existingCodes);
            existingCodes.add(randomCode);
        }
        // 验证码集合中是否有重复数据，并打印
        Set<String> codeSet = new HashSet<>(existingCodes);
        if (codeSet.size() != existingCodes.size()) {
            System.out.println("存在重复数据");
        } else {
            System.out.println("不存在重复数据");
        }

        // 打印码集合
        System.out.println("生成的随机编码: " + existingCodes);
    }

}
